//对象的创建与继承
//1.typeof的返回值:object,boolean,number,function,undefined,string; 6种.
//2.this的指向:
//	在构造函数中,this指向的是构造函数本身
//	在全局中,this指向的是window
//	在普通的对象中,this指向的是当前所在的对象;
//	在普通的方法中,this指向的是当前标签或者;

//3.原始类型和引用类型;

//对象: 是属性和方法的集合
//面向对象的编程语言:程序代码是由大量的类和对象构成;
//es6之前,js没有类的概念,提出的是原型的概念,由原型实现继承

//面向过程的编程语言:程序代码是由大量的变量和函数构成;
//方法1:字面量生成对象
var obj = {};
obj.name = 'yan';
obj.age = 16;
obj.run = function(){
	console.log(this.name + '会唱歌')
}
//obj.run() //yan会唱歌



var name = 'window对象';
var age = 10;
function run(){
	console.log(this.name + '已经' + this.age + '年')
}

//run();

//方法2:构造函数创建对象
//特点:函数名首字母大写
//	使用this关键字,添加属性和方法
//	通过new关键字实例化对象
//	

//
function Animal(name,age,color){
	this.name = name;
	this.age = age;
	this.color = color;
	this.run = function(){
		console.log( '都有四条腿' );
	}
	this.say = function(){
		console.log( '都会叫' );
	}
	//构造函数默认的函数返回值是this也就是它本身
}
//console.log( wangwang );
function Cat(name,age,color){
	Animal.call(this,name,age,color);
	this.speak = function(){
		console.log('叫声mm');
	}
}
var a = new Cat('小猫',5,'黑色','犬科动物');
console.log(a)

//构造函数的继承:
//1是初始化的项目
//2来自于1并增加新功能,
//3来自于2并增加新功能
//这是创建一个1级英雄
function Hero1(name,job){
	this.name = name;
	this.job = job;
	this.skill1 = function(){
		console.log('具备的技能是会走路..');
	}
//	console.log(this)
}
//二级英雄
function Hero2(name,job){
//	this.name = name;
//	this.job = job;
//	this.skill2 = function(){
//		console.log('具备的技能是会走路...')
//	}
	//通过call方法,调用其他构造函数并继该函数内部所有的结构
	//也就是把call的函数,调用到当前的对象(方法,函数)中,并且改变this的指向(原本的this指向的是原来的方法,函数),而现在则是指向当前的作用域的函数
	//方法是Function.prototype.call(para1,para2),所有的函数实例都能调用
	//para1:是固定值this指向,固定值(this)指向的是当前的方法所在的运行环境中的this
	//para2:是构造函数中的参数列表:参数1,参数2,参数3......
	//这里的call需要使用this,因为如果不适用的话,也就是相当于把上面的代码在这里使用一遍,又是一个单独的构造函数作用域,
	//this也就自然指向内部的构造函数,虽然输出是相同的,但是this的指向不相同,而带上this之后,就改变了this指向
	Hero1.call(this,name,job)
	this.skill2 = function(){
		console.log('具备的技能是会跳跃...')
	}
	this.skill3 = function(){
		console.log('具备的技能是会打小怪物...')
	}
}

var h2 = new Hero2('大熊','法师');
//console.log(h2)

//三级英雄
function Hero3(name,job){
//	this.name = name;
//	this.job = job;
//	this.skill2 = function(){
//		console.log('具备的技能是会走路...')
//	}
//	this.skill2 = function(){
//		console.log('具备的技能是会跳跃...')
//	}
//	this.skill3 = function(){
//		console.log('具备的技能是会打小怪物...')
//	}
	Hero2.call(this,name,job)
	this.skill4 = function(){
		console.log('具备的技能是会自爆...')
	}
}

var h3 = new Hero3('大黄','人');
//console.log(h3)


var name = 'window对象'
function show(){
	console.log(this.name);
}
var obj = {name:'obj对象',
	show:function(){
		console.log(this.name)
	}
}
//方法是Function.prototype.call(this指向,参数值)
//show();  //window对象
//这里不需要this指向改变,因为这是把show的方法放入到obj对象中,而在普通的对象中,this指向的就是当前的对象.
show.call(obj)


//改变this的指向,三种方法,call,apply,bind,MDN上有资料